package com.zhy.generator.codegen.internal.rules;
import com.zhy.generator.codegen.api.IntrospectedTable;
import com.zhy.generator.codegen.dom.java.FullyQualifiedJavaType;

/**
 * 这个接口集中了与代码生成相关的所有规则，包括要创建的方法和对象，以及与这些对象相关的某些属性。
 *
 * @author Jeff Butler
 */
public interface Rules {

    /**
     *实现用于生成insert SQL Map元素和DAO方法的规则。如果允许插入语句，则生成元素和方法。
     *
     * @return true if the element and method should be generated
     */
    boolean generateInsert();

    /**
     * 实现用于生成insert selective SQL Map元素和DAO方法的规则。如果允许插入语句，则生成元素和方法。
     *
     * @return true if the element and method should be generated
     */
    boolean generateInsertSelective();

    /**
     * 计算包含所有字段的类。该类用作insert语句参数，以及select by primary key方法返回的值。实际的类取决于如何生成域模型。
     *
     * @return the type of the class that holds all fields
     */
    FullyQualifiedJavaType calculateAllFieldsClass();

    /**
     * 实现按主键生成更新而不使用BLOBs SQL Map元素和DAO方法的规则。如果表有主键和其他非BLOB字段，并且允许updateByPrimaryKey语句，则生成元素和方法。
     *
     * @return true if the element and method should be generated
     */
    boolean generateUpdateByPrimaryKeyWithoutBLOBs();

    /**
     * 使用blobsqlmap元素和DAO方法实现按主键生成更新的规则。如果表有主键和其他BLOB字段，并且允许updateByPrimaryKey语句，则生成元素和方法。
     *
     * @return true if the element and method should be generated
     */
    boolean generateUpdateByPrimaryKeyWithBLOBs();

    /**
     * 实现按主键选择性SQL映射元素和DAO方法生成更新的规则。如果表有主键和其他字段，并且允许updateByPrimaryKey语句，则生成元素和方法。
     *
     * @return true if the element and method should be generated
     */
    boolean generateUpdateByPrimaryKeySelective();

    /**
     * 实现按主键SQL映射元素和DAO方法生成delete的规则。如果表有主键，并且允许deleteByPrimaryKey语句，则生成元素和方法。
     *
     * @return true if the element and method should be generated
     */
    boolean generateDeleteByPrimaryKey();

    /**
     * 实现通过示例SQL Map元素和DAO方法生成delete的规则。如果允许deleteByExample语句，则生成元素和方法。
     *
     * @return true if the element and method should be generated
     */
    boolean generateDeleteByExample();

    /**
     * 实现生成不带blob的结果映射的规则。如果允许选择任一方法，则生成结果映射。
     *
     * @return true if the result map should be generated
     */
    boolean generateBaseResultMap();

    /**
     * 实现用blob生成结果映射的规则。如果表有BLOB列，并且允许使用select方法，则生成结果映射。
     *
     * @return true if the result map should be generated
     */
    boolean generateResultMapWithBLOBs();

    /**
     * 实现用于生成SQL示例where子句元素的规则。
     *
     * <p>In iBATIS2, generate the element if the selectByExample, deleteByExample,
     * updateByExample, or countByExample statements are allowed.
     *
     * <p>In MyBatis3, generate the element if the selectByExample,
     * deleteByExample, or countByExample statements are allowed.
     *
     * @return true if the SQL where clause element should be generated
     */
    boolean generateSQLExampleWhereClause();

    /**
     * 实现用于生成SQL示例where子句元素的规则，该元素专门用于“updateByExample”方法。
     *
     * <p>In iBATIS2, do not generate the element.
     *
     * <p>In MyBatis, generate the element if the updateByExample statements are
     * allowed.
     *
     * @return true if the SQL where clause element should be generated
     */
    boolean generateMyBatis3UpdateByExampleWhereClause();

    /**
     * 实现用于生成SQL基列列表元素的规则。如果启用了任何select方法，则生成元素。
     *
     * @return true if the SQL base column list element should be generated
     */
    boolean generateBaseColumnList();

    /**
     * 实现用于生成SQL blob列列表元素的规则。如果启用了任何select方法，并且表包含BLOB列，则生成元素。
     *
     * @return true if the SQL blob column list element should be generated
     */
    boolean generateBlobColumnList();

    /**
     * 实现按主键SQL映射元素和DAO方法生成select的规则。如果表有主键和其他字段，并且允许selectByPrimaryKey语句，则生成元素和方法。
     *
     * @return true if the element and method should be generated
     */
    boolean generateSelectByPrimaryKey();

    /**
     * 实现用于生成不带blobsqlmap元素和DAO方法的select by示例的规则。如果允许selectByExample语句，则生成元素和方法。
     *
     * @return true if the element and method should be generated
     */
    boolean generateSelectByExampleWithoutBLOBs();

    /**
     * 实现用blobsqlmap元素和DAO方法生成select by示例的规则。如果表有BLOB字段并且允许selectByExample语句，则生成元素和方法。
     *
     * @return true if the element and method should be generated
     */
    boolean generateSelectByExampleWithBLOBs();

    /**
     * 实现生成示例类的规则。如果允许selectByExample、deleteByExample或countByExample方法，则应生成类。
     *
     * @return true if the example class should be generated
     */
    boolean generateExampleClass();

    boolean generateCountByExample();

    boolean generateUpdateByExampleSelective();

    boolean generateUpdateByExampleWithoutBLOBs();

    boolean generateUpdateByExampleWithBLOBs();

    /**
     * 实现用于确定是否生成主键类的规则。如果从该方法返回false，并且表具有主键列，则主键列将添加到基类中。
     *
     * @return true if a separate primary key class should be generated
     */
    boolean generatePrimaryKeyClass();

    /**
     * 实现生成基本记录的规则。
     *
     * @return true if the class should be generated
     */
    boolean generateBaseRecordClass();

    /**
     * 实现用blob生成记录的规则。如果从该方法返回false，并且表中有BLOB列，则BLOB列将添加到基类中。
     *
     * @return true if the record with BLOBs class should be generated
     */
    boolean generateRecordWithBLOBsClass();

    /**
     * 实现生成Java客户机的规则。仅当指定了javaClientGenerator配置，但表被指定为“modelOnly”时，此规则才处于活动状态。如果表被指定为modelOnly，则不要生成客户机。
     *
     * @return true if the Java client should be generated
     */
    boolean generateJavaClient();

    IntrospectedTable getIntrospectedTable();
}
